<?php
class AvatarGenerator {
    // 可用颜色集合
    private $colors = [
        '#3498db', '#e74c3c', '#2ecc71', '#f39c12', '#9b59b6',
        '#1abc9c', '#34495e', '#e67e22', '#16a085', '#8e44ad'
    ];
    
    // 形状类型
    private $shapes = ['circle', 'square', 'triangle', 'diamond'];
    
    /**
     * 生成随机头像
     * 
     * @param int $size 头像尺寸（像素）
     * @param string $text 可选文本（通常是用户名首字母）
     * @return string 生成的SVG图像
     */
    public function generate($size = 200, $text = '') {
        // 随机选择背景和前景颜色
        $bgColor = $this->getRandomColor();
        $fgColor = $this->getContrastingColor($bgColor);
        
        // 随机选择形状
        $shape = $this->getRandomShape();
        
        // 开始构建SVG
        $svg = '<?xml version="1.0" encoding="UTF-8"?>';
        $svg .= '<svg width="' . $size . '" height="' . $size . '" viewBox="0 0 ' . $size . ' ' . $size . '" xmlns="http://www.w3.org/2000/svg">';
        
        // 添加背景
        $svg .= '<rect width="100%" height="100%" fill="' . $bgColor . '"/>';
        
        // 添加形状
        $svg .= $this->getShapeSvg($shape, $size, $fgColor);
        
        // 如果提供了文本，添加文本
        if (!empty($text)) {
            $svg .= $this->getTextSvg($text, $size, $fgColor);
        }
        
        $svg .= '</svg>';
        
        return $svg;
    }
    
    /**
     * 获取随机颜色
     * 
     * @return string 十六进制颜色代码
     */
    private function getRandomColor() {
        return $this->colors[array_rand($this->colors)];
    }
    
    /**
     * 获取与背景色对比的颜色
     * 
     * @param string $bgColor 背景色
     * @return string 对比色（黑或白）
     */
    private function getContrastingColor($bgColor) {
        // 转换为RGB
        $rgb = hexdec(substr($bgColor, 1));
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8) & 0xFF;
        $b = $rgb & 0xFF;
        
        // 计算亮度
        $luminance = (0.299 * $r + 0.587 * $g + 0.114 * $b) / 255;
        
        // 根据亮度返回对比色
        return $luminance > 0.5 ? '#000000' : '#FFFFFF';
    }
    
    /**
     * 获取随机形状
     * 
     * @return string 形状名称
     */
    private function getRandomShape() {
        return $this->shapes[array_rand($this->shapes)];
    }
    
    /**
     * 获取形状的SVG代码
     * 
     * @param string $shape 形状名称
     * @param int $size 尺寸
     * @param string $color 颜色
     * @return string SVG代码
     */
    private function getShapeSvg($shape, $size, $color) {
        $half = $size / 2;
        $quarter = $size / 4;
        $threeQuarter = $size * 3 / 4;
        
        switch ($shape) {
            case 'circle':
                return '<circle cx="' . $half . '" cy="' . $half . '" r="' . $quarter . '" fill="' . $color . '" opacity="0.7"/>';
            case 'square':
                return '<rect x="' . $quarter . '" y="' . $quarter . '" width="' . $half . '" height="' . $half . '" fill="' . $color . '" opacity="0.7"/>';
            case 'triangle':
                return '<polygon points="' . $half . ',' . $quarter . ' ' . $quarter . ',' . $threeQuarter . ' ' . $threeQuarter . ',' . $threeQuarter . '" fill="' . $color . '" opacity="0.7"/>';
            case 'diamond':
                return '<polygon points="' . $half . ',0 ' . $size . ',' . $half . ' ' . $half . ',' . $size . ' 0,' . $half . '" fill="' . $color . '" opacity="0.7"/>';
            default:
                return '';
        }
    }
    
    /**
     * 获取文本的SVG代码
     * 
     * @param string $text 文本
     * @param int $size 尺寸
     * @param string $color 颜色
     * @return string SVG代码
     */
    private function getTextSvg($text, $size, $color) {
        // 取文本的第一个字符并转为大写
        $char = strtoupper(substr($text, 0, 1));
        $fontSize = $size * 0.5;
        
        return '<text x="50%" y="50%" font-family="Arial, sans-serif" font-size="' . $fontSize . '" fill="' . $color . '" text-anchor="middle" dominant-baseline="middle">' . $char . '</text>';
    }
    
    /**
     * 保存头像到文件
     * 
     * @param string $svg SVG内容
     * @param string $filename 文件名
     * @return bool 是否保存成功
     */
    public function saveToFile($svg, $filename) {
        return file_put_contents($filename, $svg) !== false;
    }
    
    /**
     * 输出头像到浏览器
     * 
     * @param string $svg SVG内容
     */
    public function output($svg) {
        header('Content-Type: image/svg+xml');
        echo $svg;
    }
}